_______ ____|__ | (R) --| | |------------------- | ____|__ | Association of | | |_| Shareware |__| o | Professionals -----| | |--------------------- |___|___| MEMBER Het programma dat hieronder wordt beschreven is gemaakt door Feico Nater Shareware, Beukweg 24, 7556 DE Hengelo. Dit programma wordt beschikbaar gesteld als shareware. Wat is shareware? Het is software dat door de gebruikers gecopieerd en uitgedeeld mag worden, maar ik, de auteur behoud het auteurs- recht. Misschien heeft u het programma voor een laag bedrag `gekocht' van een bulletin-board en er voor betaald, maar ik krijg daar geen cent van. Ik verwacht dat u mij rechtstreeks betaalt, want ik verdien mijn levensonderhoud met het maken van shareware. Dus, als dit programma u bevalt en u besluit het te gebrui- ken, dan wordt van u verwacht dat u een bedrag van 69 gulden (inclusief BTW) overmaakt op mijn rekening bij de Postbank, nummer 96541. Helaas kan ik geen kredietkaarten accepteren. Waarom zou u registreren? Het kost u natuurlijk geld. Maar ik zal u op de hoogte houden van verdere ontwikkelingen en u krijgt het recht om nieuwere versies te bestellen voor de prijs van porto en floppy. Tenslotte zal ik bereid zijn om naar uw verlangens te luisteren. En als het programma u niet bevalt? Dan kan u het weggooi- en. Maar ongetwijfeld zal het idee van shareware u bevallen, omdat u niet veel geld hoeft te betalen voor iets dat achteraf toch tegenvalt. Maar of u nu registreert of niet, u wordt aangemoedigd dit systeem verder rond te delen. Geef copie‰n aan uw vrienden. De copie‰n die u ronddeelt moeten volledig en ongewijzigd zijn, maar gebruik van file-compressie is toegestaan. U mag alleen een maximum van tien gulden vragen voor de floppy, verpakking en verzending. Over de auteur Ik werk met computers sedert 1970. Ik heb een HBO-studie in informatica voltooid. Daarna heb ik vele jaren gewerkt in de defensie-industrie, en mijn collega's beschouwden mij als de bekwaamste programmeur onder hen. Maar dank zij Gorbatsjov (wat ik hem niet kwalijk kan nemen) ging het slechter met de defensie- industrie. Sindsdien werk ik als shareware-auteur. ******************************* * D I S A S T E R * ******************************* Disaster is een interactieve disassembler voor de IBM-PC. Een disassembler is niets bijzonders. Het programma DEBUG wordt bij MSDOS geleverd en bevat een disassembler. Maar DEBUG kent alleen de instructies van de 8086 en 8088. Verder levert DEBUG geen coding die geschikt is om weer als input voor een assembler te dienen. Geen enkele disassembler maakt met ‚‚n druk op de knop een keurig assemblerprogramma. In tegendeel, het disassembleren van een beetje programma is vele dagen werk. De eenvoudigst denkbare disassembler werkt rechttoe-rechtaan. Hij leest het machinetaalprogramma van voor tot achter en vertaalt alles naar assembler-taal, ongeacht of het code of data is. Disaster werkt interactief. U kan het machinetaalprogramma op uw gemak bekijken, labels en commentaar toevoegen, aangeven wat code en wat data is. Het resultaat kan worden opgeborgen om de volgende dag verder te kunnen gaan. Tenslotte maakt DISASTER een correct assemblerprogramma. Deze gebruiksaanwijzing is heel kort. Er is niet meer uit te leggen. Kennis van de PC en de assembleertaal wordt echter bekend verondersteld. SAMENVATTING VAN COMMANDO'S (in plaats van een adres is altijd een label toegestaan) ; adres,commentaar geef commentaar op ; adres,- verwijder commentaar A adres,adres automatische generatie van labels B adres,adres automatische generatie van controls en labels C adres,letter control code of data C adres,- verwijder control F ???? zoek woord L adres,label geef een label op L adres,- verwijder een label L oude-naam,nieuwe-naam vervang een label Q stop, of sluit uitvoerfile R prognaam lees een programma in S schrijf een script-file U adres,adres disassembleer W maak output-file DEMONSTRATIE U start DISASTER de eerste keer met het commando: DISASTER Er komt nu een foutmelding die u mag negeren. Op het scherm verschijnt de prompt --> om aan te geven dat DISASTER uw commando's verwacht. Vervolgens leest u een programma in met het commando: R naam.EXE of: R naam.COM of: R naam.SYS Wil u iets disassembleren wat reeds in het geheugen staat, dan is het commando: R segmentadres.ROM Nu moet u eerst aangeven dat uw programma als instructiecode moet worden gedisassembleerd met het commando (precies zo): C Lstartlocation,I Nu begint het disassembleren! Geef het commando: U Lstartlocation wat resulteert in een stukje gedisassembleerd programma op het scherm. Links verschijnen de adressen, daarnaast de mnemonische code, en rechts (in kleur) de oorspronkelijke machinetaal. Een groen blokje betekent dat er geen geldige opcode werd gevonden. Voorvoegsels komen in geel, opcodes in groen, modrm-bytes en sib- bytes in rood, operanden in blauw. Varianten op het U-commando zijn: U adres disassembleer 20 regels vanaf adres U adres,adres disassembleer van .. tot .. U disassembleer volgende 20 regels idem Adressen in commando's worden altijd hexadecimaal opgegeven. In plaats van adressen kan u ook labels (zie hierna) opgeven. HULP Hulpteksten verschijnen met de toetsen F5 tot en met F10. Een willekeurige toets verwijdert de tekst weer. Druk liever niet op de hulptoetsen terwijl DISASTER met een opdracht bezig is, het heeft enigszins vreemde (geen ernstige) gevolgen. F1 en F3 kunnen, net als in COMMAND.COM, worden gebruikt om commando's te herhalen, en de toetsen Insert, Delete en Backspace werken normaal. LABELS Alle adressen komen hexadecimaal op het scherm. Natuurlijk wil u labels zien. Dat kan met het commando: L adres,label Een label moet, zoals gebruikelijk, met een letter beginnen. Verder moet minstens een keer de letter G tot en met Z er in voorkomen. De maximale lengte van een label is veertien tekens. Komt in een label geen van de letters G tot en met Z voor, dan beschouwt DISASTER het als een hexadecimaal adres. Wees voorzichtig met het gebruik van labels die met de letter L beginnen. De functie die automatisch controls genereert veronderstelt namelijk dat zo'n label bij instructiecode staat. Labels kunnen worden gebruikt in commando's. Het U commando wordt dan bijvoorbeeld: U label,label. Labels kunnen worden verwijderd met het commando: L label,- of, wat op het zelfde neerkomt: L adres,- Labels kunnen van naam worden veranderd met het commando: L oude naam,nieuwe naam Het is niet mogelijk twee labels op het zelfde adres te defini‰ren. Het maximale aantal labels is 4090. INITIEEL GEGENEREERDE LABELS Als u een file inleest, dan genereert Disaster automatisch een aantal labels in de header van de file. De meeste van deze labels beginnen met de letter Z. Er komt ook een label et de naam LSTARTLOCATION, en dat is het adres waar de executie begint. CONTROLs Niet alles wat u ziet is instructiecode. Er is ook data. De disassembler kan echter het verschil niet zien. Bovendien bestaat er code en data in soorten. U moet zelf aangeven wat code en wat data is en welke soort het is. Dat gaat door controls te zetten met het commando: C adres,letter(s) of, wat op het zelfde neerkomt: C label,letter(s) Een control kan worden verwijderd met: C adres,- of: C label,- Vanaf het aangegeven adres wordt gedisassembleerd volgens de letter. Die letter kan zijn: B hexadecimale bytes T tekst tussen quotes, voor zover mogelijk W hexadecimale woorden I instructiecode voor Intel chips IV instructiecode voor NEC V20 of V30 IA instructiecode voor 80386 in protected mode met een operand- en adreslengte van 32 bits. B, T en W zijn data-controls, de overige zijn code-controls. Dit is een belangrijk onderscheid voor de verderop besproken A- en B-commando's. De controls delen uw programma in stukken. Er zijn datastukken en codestukken. Als DISASTER een opcode tegenkomt die geldig is op NEC-chips maar niet op Intel-chips, of andersom, dan wordt die gewoon gedisassembleerd. Of I of IV werd opgegeven is dan niet van belang. Maar er zijn opcodes die bij NEC en Intel iets anders betekenen. In dat geval beslist I of IV. Programma's waarbij het onderscheid tussen I en IV belangrijk is zijn overigens zeldzaam. IA kan alleen worden gebruikt bij programma's die op de 80386 in protected mode draaien. In real mode geldt immers altijd een default-adres- en -operand-lengte van 16 bits. Het maximale aantal controls is 16380. INITIEEL OPGEVOERDE CONTROLS Leest u een file in, dan worden automatisch wat controls bij de velden van de header gezet. In het grootste deel van uw programma geldt een T-control. Dat mag vreemd lijken, maar het is gedaan omdat nog niet bekend is waar de overige controls moeten staan, en de T-control maakt het herkennen van leesbare tekst gemakkelijk. AUTOMATISCH GENEREREN VAN LABELS Het handmatig plaatsen van de labels en controls is een enorm karwei. Daarom is dit werk in DISASTER gedeeltelijk geautomatiseerd. Labels worden automatisch gegenereerd met het commando: A adres,adres DISASTER doorzoekt nu uw programma, en geeft tegelijk een listing op het scherm. Alleen de codestukken worden onderzocht, datastukken worden overgeslagen. Elke keer als DISASTER een adresverwijzing tegenkomt wordt hiervoor een label opgevoerd. Zo'n opgevoerd label heeft de vorm: L45A3_27E5. De eerste letter van het opgevoerde label geeft het soort verwijzing aan: L spronginstructie W woorddata T bytedata Na die eerste letter komt het hexadecimale adres waar het label naar verwijst, want het kind moet een naam hebben. Daarna een onderstreping, en ten slotte het adres waar de verwijzing voor het eerst werd aangetroffen. Dat laatste vergemakkelijkt het onderzoek van het programma. Elke keer als een label wordt opgevoerd toont DISASTER een blokje op het scherm. Zo'n blokje komt dus te staan bij iedere JMP- en CALL-instructie en bij iedere geheugenverwijzing waar nog geen label aanwezig is. AUTOMATISCH GENEREREN VAN CONTROLS Controls worden automatisch gegenereerd met het commando B adres,adres DISASTER doorzoekt nu de labels van uw programma. Elke keer als DISASTER in een datastuk een label tegenkomt dat met een L begint wordt hier een control I opgevoerd, zodat de verdere programmatekst als instructiecode wordt ge‹nterpreteerd. Bij de eerstvolgende onvoorwaardelijke RET- of JMP-instructie wordt een control opgevoerd om de oorspronkelijke toestand te herstellen. Elke keer als een control wordt opgevoerd toont DISASTER een blokje op het scherm. Zo'n blokje komt dus: 1 bij een label dat met een L begint en dat in een datagebied stond. 2 bij de eerste RET- of JMP-instructie daarna. Elke keer als een control I wordt opgevoerd, wordt bovendien het betreffende stuk doorzocht naar adresverwijzingen, waar dan (zoals in het vorige hoofdstuk stond) labels voor worden gegenereerd. GEBRUIK VAN DE MUIS U wil misschien een label of control opvoeren, maar u weet het precieze adres niet. Bijvoorbeeld, de disassembly bevat de regel: 0357 DB 'Press any key',0,'Invalid command' Er moet een label achter de letter I. Type nu L, neem de muis en klik met de linker knop op de letter I. Het gewenste adres verschijnt op de commandoregel, net alsof u het zelf intypte. Maak het commando verder af. Klikt u met de linker knop ergens op de disassembly, dan verschijnt het adres van het punt waar u klikte op de commandoregel. Klikt u met de rechter knop, dan verschijnt het getal of label op de commandoregel. De linker knop werkt niet goed als er een regelomhaal op het scherm is gekomen. AANWIJZINGEN Meestal begint een disassembly aldus: C:\disaster Start DISASTER --->Rprogr.com lees het programma --->B100,ffff genereer labels en controls --->B100,ffff --->B100,ffff --->B100,ffff Op het scherm ziet u hoe steeds meer labels worden geplaatst en hoe steeds meer code-controls worden gezet. Het commando B100,ffff kan eenvoudig worden herhaald met de F3- toets. Herhaal het tot DISASTER meldt dat er niet meer labels en controls zijn toegvoegd. Als het een beetje wil is de disassembly hiermee al haast voltooid, en u hoeft er niets voor te doen! Kom daar eens om bij een andere disassembler. Kan er dan niets foutgaan? Helaas, niets is volmaakt, bijvoorbeeld in de volgende gevallen: 0150 JNZ L0123 0152 JZ L0156 0154 ADD B[BX+SI],AL Het B-commando denkt dat de laatste instructie code is, want er staat geen onvoorwaardelijke sprongopdracht voor. Maar JNZ en JZ zijn samen onvoorwaardelijk. De coding vanaf adres 0154 zal dus als instructiecode worden beschouwd. Komen hier dingen voor die lijken op instrcties met adresverwijzingen, dan worden er valse labels gegenereerd. Als u oplet tijdens de uitvoering van het B-commando, dan zal u dit onheil wel opmerken. Onderbreek het commando met een willekeurige toets, blader met het U-commando door het programma om de juiste plek te vinden en zet op adres 0154 een data- control. INT 020 Dit is het einde van het programma, wat trouwens ook geldt voot INT 021 met AH=00 of 04C. Het B-commando herkent dit niet. U moet zelf hierachter een data-control zetten. JMP [08170+BX] Dit is een sprong via een tabel van sprongadressen. Dit wordt door DISASTER niet herkend. U moet zelf labels toekennen aan de adressen in de tabel. Gebruikt u labels die met een L beginnen, dan zal het B-commando de gelabelde tekst als code beschouwen. COMMENTAAR U kan commentaar toevoegen met het commando: ;adres,tekst en natuurlijk ook met ;label,tekst Let op de kommapunt die dit commando inluidt! Commentaar kan worden verwijderd met: ;adres,- of: ;label,- Commentaar wordt getoond voorafgaand aan het genoemde adres. In een data-gedeelte veroorzaakt het commentaar een nieuwe regel. Een commentaar middenin een instructie of midden in een woord- constante wordt genegeerd. De backslash \ heeft een speciale betekenis: hij levert een nieuwe regel op, zodat een commentaar meerdere regels kan omvatten. Twee backslashes aan het begin van een commentaar geven een nieuwe pagina. ;adres,commentaar van een regel ;adres,\een regel met een lege regel ervoor ;adres,\\eerste regel op een pagina\volgende regel De maximale lengte van een commentaarregel is 127 bytes. Er kunnen geen twee commentaarregels op een adres staan. De maximale hoeveelheid commentaar is ongeveer 62500 bytes, plus wat overhead. Verder zal u, natuurlijk, de gegenereerde labels vervangen door namen die duidelijk aangeven wat er gebeurt. OPTIES Sommige instellingen van de disassembler kunnen veranderd worden. Een optie kan worden aangezet met de letter O, gevolgd door de letter die de optie aangeeft. Een optie kan worden uitgezet met de letter O, de letter die de optie aangeeft, een komma en een streepje. De volgende opties zijn beschikbaar. OP geheugenverwijzing voorafgegaan door B, W of D OP,- geheugenverwijzing voorafgegaan door BYTE PTR or (D)WORD PTR OL code labels op een aparte regel OL,- labels en code op dezelfde regel OA adresses naar file en scherm OA,- adressen alleen naar het scherm OH hexadecimale waarden worden voorafgegaan door een nul als het eerste cijfer anders A-F zou zijn, en ze worden gevolgd door de letter h. OH,- hexadecimale waarden worden altijd voorafgegaan door een nul en niet gevolgd door een h. OO impliciete operanden na XLAT, MOVS, OUTS, SCAS en dergelijke instructies worden altijd gegenereerd. OO,- impliciete operanden worden alleen gegenereerd als er een segment override is. Druk op F10 om de huidige instelling van de opties te zien. MAKEN VAN EEN SOURCE-FILE Het uiteindelijke doel van disassembleren is dat er een source- file ontstaat. Deze source-file kan met een assembler weer geassembleerd worden. De source-file wordt geopend met het commando W De source-file heeft de zelfde naam als de .SYS-, .EXE- of .COM-file, doch met de extensie .8. Zolang de source-file open is is de prompt >>>. Alleen de commando's O, U en Q zijn nu toegestaan. Na het commando W geeft u een of meer U-commando's. Op het scherm komen nu alleen nog maar de adressen, de gedisassembleerde tekst gaat naar de file. Tenslotte sluit u de file met het commando Q Nu verschijnt weer de prompt -->. Wellicht verwacht u dat u, door de source-file weer te assembleren, weer de zelfde .COM- of .EXE-file terugkrijgt. In de praktijk zal dat tegenvallen, omdat meerdere machine- instructies de zelfde functie hebben. Bijvoorbeeld: MOV AX,BX 8BC3 of 89D8 REP MOVSB F3A4 of F2A4 ADD BX,5 83C305 of 81C30500 JMP $+8 EB06 of E90500 Verder zijn er instructies denkbaar die voor de processor niet uitvoerbaar zijn, zoals SHL AL,30 of BOUND AX,BX. DISASTER accepteert zulke instructies, de assembler zal ze misschien weigeren. STOPPEN EN VERDERGAAN U heeft na vele uren werk uw programma uitgebreid met Labels en Controls. Om de volgende dag verder te kunnen gaan geeft u het commando: S Er wordt nu een zogenaamde scriptfile gemaakt. Deze heeft de extensie .SCR en, als u geen andere naam opgaf, dezelfde naam als uw programma. Bestaat de scriptfile al, dan vraagt DISASTER om bevestiging. Tenslotte stopt u met het commando: Q Is er nog geen scriptfile gemaakt , dan vraagt DISASTER om bevestiging. Om verder te gaan start u de disassembler met het commando DISASTER filenaam waarbij u de naam van de scriptfile opgeeft. DISASTER onderzoekt namelijk eerst of de opgegeven filenaam een scriptfile is. Is dat niet het geval, dan zoekt DISASTER een .COM- of .EXE-file. Een scriptfile is een ASCII-file en bevat gewone commando's voor de disassembler. Niets verbiedt u de scriptfile met een teksteditor te bewerken.